#ifndef IO_H
#define IO_H

#include <QThread>
#include "xnserial.h"
//#include "ComStruct.h"
//#include "rtdb.h"
#include  "KgGlobalData.h"

class CIO : public QThread
{
	Q_OBJECT

public:
	CIO(QObject *parent = 0);
	~CIO();

public:
	void run();
	int init();
	//CIOModule* getIOModule();

private:	
	// 函数声明：打印发送信息
	// 参数：
	// pDataBuf - 指向数据缓冲区的指针
	// iCmdSendNum - 发送的命令编号
	void printSendInfo(char* pDataBuf, int iCmdSendNum);
	// 函数声明：打印接收信息
	// 参数：
	// pDataBuf - 指向数据缓冲区的指针
	// iLen - 接收到的数据长度
	void printReceInfo(char* pDataBuf, int iLen);

	int formDatagram(int iType, int iModbusID, int iDOIndex = 0, quint16 usDOCtrlVal = 0);
	int analyDatagram(int iType, int iModbusID, char* pDataBuf, int iLen);
	void readDataFromSerial();

	int prepareExcepDatagram(uchar uaExcepCode);

	int addParam2Buffer(char* pData, quint16 uiParamVal);
	int getParamFromBuffer(char* pData, quint16& uiParamVal);
	int addModbusCRC2Buffer(char *pData, int iLen);
	quint16 Modbus_CRC16(char *pData, quint16 usLen);
	
private:
	CXnSerial* m_pSerial;
	//CRTDB* m_pRTDB;
	// 声明一个指向 CIOModule 类型的指针变量 m_pIOModule
	CIOModule* m_pIOModule; // 指向CIOModule对象的指针，用于管理I/O模块

	bool m_bSerialOK;        // 串口状态标志，表示串口是否正常工作
	QString m_strPortName;   // 串口名称，存储串口的标识符，如"COM1"
	int m_iBaudRate;               // 波特率，表示串口通信的速率
	int m_iDataBits;               // 数据位，表示每个数据帧中的数据位数，常见的有8位
	int m_iStopBits;               // 停止位，表示每个数据帧结束时的停止位数，常见的有1位或2位
	int m_iParity;                  // 校验位，表示数据帧的校验方式，如无校验、奇校验、偶校验等
	int m_iRtscts;          // 硬件流控制标志，表示是否启用RTS/CTS流控制

	bool m_bPrintMsg;       // 打印消息标志，表示是否在控制台或日志中打印消息
	int m_iSerialDataLen;   // 串口数据长度，表示当前接收或发送的数据长度
	char* m_pSerialDataBuf;   // data buffer
	int  m_logCount;
};

#endif // IO_H
